def add_transaction(book, item, currency): logging.info('Adding transaction for account "%s" (%s %s)..', item.account, item.split_amount, currency.get_mnemonic()) root = book.get_root_account() acc = lookup_account(root, item.account) tx = Transaction(book) tx.BeginEdit() tx.SetCurrency(currency) tx.SetDateEnteredTS(datetime.datetime.now()) tx.SetDatePostedTS(item.date) tx.SetDescription(item.memo) s1 = Split(book) s1.SetParent(tx) s1.SetAccount(acc) amount = int( Decimal(item.split_amount.replace(',', '.')) * currency.get_fraction()) s1.SetValue(GncNumeric(amount, currency.get_fraction())) s1.SetAmount(GncNumeric(amount, currency.get_fraction())) acc2 = lookup_account(root, item.split_category) s2 = Split(book) s2.SetParent(tx) s2.SetAccount(acc2) s2.SetValue(GncNumeric(amount * -1, currency.get_fraction())) s2.SetAmount(GncNumeric(amount * -1, currency.get_fraction())) tx.CommitEdit()
def _insert_transaction(session, record, currency, rec_date, account_to, account_from): book = session.book # set currency comm_table = book.get_table() currency = comm_table.lookup("CURRENCY", currency) transaction = gnucash.Transaction(book) transaction.BeginEdit() split_to = Split(book) # TODO - create money representation based on fractions value = GncNumeric(record.value.cents(), 100) split_to.SetValue(value) split_to.SetAccount(account_to) split_to.SetParent(transaction) split_from = Split(book) split_from.SetValue(value.neg()) split_from.SetAccount(account_from) split_from.SetParent(transaction) # set transaction values transaction.SetDate(rec_date.day, rec_date.month, rec_date.year) transaction.SetDescription(record.description) transaction.SetCurrency(currency) transaction.CommitEdit()
def createRandomTransactions(book, accountA, accountB): split = Split(book) currency = book.get_table().lookup("CURRENCY", "EUR") print("Create 100 random transactions") for i in range(100): trans = Transaction(book) trans.BeginEdit() trans.SetCurrency(currency) trans.SetDate(randint(1, 28), randint(1, 12), randint(1900, 2000)) trans.SetDescription("Transaction " + str(i)) value = randint(0, 10000) value1 = GncNumeric(value, 100) value2 = GncNumeric(-value, 100) split1 = Split(book) split1.SetValue(value1) split1.SetAccount(accountA) split1.SetMemo("A" + str(i)) split1.SetParent(trans) split2 = Split(book) split2.SetValue(value2) split2.SetAccount(accountB) split2.SetMemo("B" + str(i)) split2.SetParent(trans) trans.CommitEdit()
def _transfer(self, book, d): from_ac = book.get_root_account().lookup_by_code(d['TransferFromAC']) if not from_ac: raise LookupError('TransferFromAC ({0}) not found'.format( d['TransferFromAC'])) to_ac = book.get_root_account().lookup_by_code(d['TransferToAC']) if not to_ac: raise LookupError('TransferToAC ({0}) not found'.format( d['TransferToAC'])) if 'Currency' in d: currency = book.get_table().lookup('CURRENCY', d['Currency']) else: currency = book.get_table().lookup('CURRENCY', 'CHF') if not currency: raise LookupError('Currency ({0}) not found'.format(d['Currency'])) trans = Transaction(book) trans.BeginEdit() trans.SetCurrency(currency) date = d.get('Date', datetime.date.today()) trans.SetDate(date.day, date.month, date.year) # trans.SetDateEnteredTS(datetime.datetime.now()) # trans.SetDatePostedTS(item.date) trans.SetDescription( d.get('Description', 'Auto Generated by Json import')) amount = int(d.get('Amount', 0) * currency.get_fraction()) split1 = Split(book) split1.SetParent(trans) split1.SetAccount(from_ac) split1.SetValue(GncNumeric(amount, currency.get_fraction())) split1.SetAmount(GncNumeric(amount, currency.get_fraction())) split2 = Split(book) split2.SetParent(trans) split2.SetAccount(to_ac) split2.SetValue(GncNumeric(amount * -1, currency.get_fraction())) split2.SetAmount(GncNumeric(amount * -1, currency.get_fraction())) trans.CommitEdit() logging.info( 'New Transfer: Amount {0} , from:{1}, to:{2}, memo: {3}'.format( d.get('Amount', 0), d['TransferFromAC'], d['TransferToAC'], d.get('Description', 'Auto Generated by Json import')))
def NewSplit(self, txn, acct, amount): s = Split(self._book) s.SetParent(txn) s.SetAccount(acct) s.SetAmount(self.rat(amount)) s.SetValue(self.rat(amount)) return s
def test_assignlots(self): abc = GncCommodity(self.book, 'ABC Fund', 'COMMODITY','ABC','ABC',100000) self.table.insert(abc) self.account.SetCommodity(abc) other = Account(self.book) other.SetCommodity(self.currency) tx = Transaction(self.book) tx.BeginEdit() tx.SetCurrency(self.currency) tx.SetDateEnteredSecs(datetime.now()) tx.SetDatePostedSecs(datetime.now()) s1a = Split(self.book) s1a.SetParent(tx) s1a.SetAccount(self.account) s1a.SetAmount(GncNumeric(1.3)) s1a.SetValue(GncNumeric(100.0)) s1b = Split(self.book) s1b.SetParent(tx) s1b.SetAccount(other) s1b.SetAmount(GncNumeric(-100.0)) s1b.SetValue(GncNumeric(-100.0)) s2a = Split(self.book) s2a.SetParent(tx) s2a.SetAccount(self.account) s2a.SetAmount(GncNumeric(-1.3)) s2a.SetValue(GncNumeric(-100.0)) s2b = Split(self.book) s2b.SetParent(tx) s2b.SetAccount(other) s2b.SetAmount(GncNumeric(100.0)) s2b.SetValue(GncNumeric(100.0)) tx.CommitEdit() self.account.ScrubLots() self.assertEqual(len(self.account.GetLotList()),1)
def add_transaction(self, item): """ add new transaction item must have following keys """ assert "date" in item.keys() assert "description" in item.keys() assert "notes" in item.keys() assert "soll" in item.keys() assert "soll_value" in item.keys() assert "haben" in item.keys() assert "haben_value" in item.keys() commod_tab = self.__book.get_table() currency = commod_tab.lookup('ISO4217', "EUR") logging.info('Adding transaction for account "%s" (%s %s)..', item["soll"], item["soll_value"], currency.get_mnemonic()) tx = Transaction(self.__book) tx.BeginEdit() tx.SetCurrency(currency) tx.SetDateEnteredTS(datetime.datetime.now()) tx.SetDatePostedTS(item["date"]) tx.SetDescription(item["description"]) tx.SetNotes(item["notes"]) if "num" in item.keys(): tx.SetNum(item["num"]) # soll acc = self.account_from_path(self.get_root(), item["soll"].split(".")) s1 = Split(self.__book) s1.SetParent(tx) s1.SetAccount(acc) amount = int(item["soll_value"] * currency.get_fraction()) s1.SetValue(GncNumeric(amount, currency.get_fraction())) s1.SetAmount(GncNumeric(amount, currency.get_fraction())) # haben acc2 = self.account_from_path(self.get_root(), item["haben"].split(".")) s2 = Split(self.__book) s2.SetParent(tx) s2.SetAccount(acc2) amount = int(item["haben_value"] * currency.get_fraction()) s2.SetValue(GncNumeric(amount, currency.get_fraction())) s2.SetAmount(GncNumeric(amount, currency.get_fraction())) tx.CommitEdit()
def write_transactions(self, transactions): for transaction in transactions: tx = Transaction(self.book) tx.BeginEdit() tx.SetCurrency(self.currency) tx.SetDateEnteredTS(datetime.datetime.now()) tx.SetDatePostedTS(transaction.datetime) tx.SetDescription(transaction.description) tx.SetNotes(transaction.note) for split in transaction.splits: sp = Split(self.book) sp.SetParent(tx) sp.SetAccount(GnucashBook.lookup_account(self, split.account)) sp.SetMemo(split.memo) amount = int( Decimal(split.amount) * self.currency.get_fraction()) sp.SetValue(GncNumeric(amount, self.currency.get_fraction())) sp.SetAmount(GncNumeric(amount, self.currency.get_fraction())) tx.CommitEdit()
def initialize_split(book, value, account, trans): split = Split(book) split.SetValue(value) split.SetAccount(account) split.SetParent(trans) return split
account.SetType(3) account2.SetCommodity(USD) account2.SetName("blahblahsdfs ") account2.SetType(3) a = Transaction(book) a.BeginEdit() s = Split(book) s.SetParent(a) s2 = Split(book) s2.SetParent(a) a.SetCurrency(CAD) s.SetAccount(account) s.SetValue(GncNumeric(2)) s.SetAmount(GncNumeric(2)) s2.SetAccount(account2) s2.SetValue(GncNumeric(4)) s2.SetAmount(GncNumeric(4)) print 'overall imbalance', a.GetImbalanceValue().to_string() print 'per-currency imbalances' imbalance_list = a.GetImbalance() for (commod, value) in imbalance_list: print value.to_string(), commod.get_mnemonic() a.CommitEdit() session.end()
#Set up Expenses account expenses_acct.SetCommodity(cad) expenses_acct.SetName("Expenses") expenses_acct.SetType(9) #ACCT_TYPE_EXPENSE = 9 #Set up Savings account savings_acct.SetCommodity(cad) savings_acct.SetName("Savings") savings_acct.SetType(0) #ACCT_TYPE_BANK = 0 #Set up Opening Balance account opening_acct.SetCommodity(cad) opening_acct.SetName("Opening Balance") opening_acct.SetType(10) #ACCT_TYPE_EQUITY = 10 split1.SetValue(num1) split1.SetAccount(expenses_acct) split1.SetParent(trans1) split3.SetValue(num2) split3.SetAccount(savings_acct) split3.SetParent(trans2) trans1.SetCurrency(cad) trans1.SetDate(14, 3, 2006) trans1.SetDescription("Groceries") trans2.SetCurrency(cad) trans2.SetDate(7, 11, 1995) trans2.SetDescription("Opening Savings Balance")
# gets a guid on construction print("s1 guid = {0}".format(s1.GetGUID().to_string())) s2 = Split(book) s2.SetParent(tx) # gets a guid on construction print("s2 guid = {0}".format(s2.GetGUID().to_string())) tx.SetCurrency(CAD) tx.SetDate(13, 2, 2013) tx.SetDescription(argv[5]) tx.SetNotes("Python {0}".format(argv[0])) # tx: set action ? # set the account and amount of split1 s1.SetAccount(acct1) s1.SetValue(GncNumeric(amount, 100)) # s1.SetAmount(GncNumeric(amount, 100)) # set the account and amount of split2 s2.SetAccount(acct2) s2.SetValue(GncNumeric(amount2, 100)) # s2.SetAmount(GncNumeric(amount2, 100)) print("Tx imbalance = {0}".format(tx.GetImbalanceValue().to_string())) mode = argv[5].upper() if mode != "PROD": print("Mode = {}: Roll back changes!".format(mode)) tx.RollbackEdit() else: print("Mode = {}: Commit and save changes.".format(mode))
#Set up Expenses account expenses_acct.SetCommodity(cad) expenses_acct.SetName("Expenses") expenses_acct.SetType(9) #ACCT_TYPE_EXPENSE = 9 #Set up Savings account savings_acct.SetCommodity(cad) savings_acct.SetName("Savings") savings_acct.SetType(0) #ACCT_TYPE_BANK = 0 #Set up Opening Balance account opening_acct.SetCommodity(cad) opening_acct.SetName("Opening Balance") opening_acct.SetType(10) #ACCT_TYPE_EQUITY = 10 split1.SetValue(num1) split1.SetAccount(expenses_acct) split1.SetParent(trans1) split3.SetValue(num2) split3.SetAccount(savings_acct) split3.SetParent(trans2) trans1.SetCurrency(cad) trans1.SetDescription("Groceries") trans2.SetCurrency(cad) trans2.SetDescription("Opening Savings Balance") split2 = split1.GetOtherSplit() split2.SetAccount(savings_acct)
def _initialize_split(self, book, amount, account, trans): split = Split(book) split.SetValue(GncNumeric(amount)) split.SetAccount(account) split.SetParent(trans) return split
def create_split_transaction(book, bank_acc_name, exp_acc_name, trans_date, description, amount, vat_incl=True): """ @todo: more generic handling of assets/income/expenses/liabilities """ root = book.get_root_account() comm_table = book.get_table() currency = comm_table.lookup("CURRENCY", settings.GNUCASH_CURRENCY) bank_acc = root.lookup_by_name(bank_acc_name) exp_acc = root.lookup_by_name(exp_acc_name) if vat_incl: vat_acc = root.lookup_by_name(settings.GNUCASH_VAT_ACCOUNT) trans1 = Transaction(book) trans1.BeginEdit() num1 = gnc_numeric_from_decimal(amount) # total if vat_incl: num2 = gnc_numeric_from_decimal( (amount / Decimal(settings.GNUCASH_VAT_RATE)).quantize( Decimal("0.01"))) # subtotal num3 = gnc_numeric_from_decimal( amount - (amount / Decimal(settings.GNUCASH_VAT_RATE)).quantize( Decimal("0.01"))) # vat else: num2 = num1 # total if bank_acc_name == settings.GNUCASH_CARD_ACCOUNT: num1 = num1.neg() num2 = num2.neg() try: num3 = num3.neg() except NameError: pass split1 = Split(book) split1.SetAccount(exp_acc) split1.SetParent(trans1) split1.SetValue(num2.neg()) if vat_incl: split2 = Split(book) split2.SetAccount(vat_acc) split2.SetParent(trans1) split2.SetValue(num3.neg()) split3 = Split(book) split3.SetAccount(bank_acc) split3.SetParent(trans1) split3.SetValue(num1) trans1.SetCurrency(currency) trans1.SetDate(trans_date.day, trans_date.month, trans_date.year) trans1.SetDescription(description) trans1.CommitEdit()
trans = Transaction(book) trans.BeginEdit() trans.SetCurrency(USD) trans.SetDescription(str(txinfo['description'])) trans.SetDate(txinfo['date'].day, txinfo['date'].month, txinfo['date'].year) split1 = Split(book) split1.SetParent(trans) split1.SetAccount(acct) if txinfo.has_key('memo'): split1.SetMemo(str(txinfo['memo'])) # The docs say both of these are needed: # http://svn.gnucash.org/docs/HEAD/group__Transaction.html split1.SetValue(gnc_amount) split1.SetAmount(gnc_amount) split1.SetReconcile('c') if opposing_acct != None: debug_print( 'Categorizing transaction %s as %s' % (get_transaction_string(txinfo), opposing_acct_path)) split2 = Split(book) split2.SetParent(trans) split2.SetAccount(opposing_acct) split2.SetValue(gnc_amount.neg()) split2.SetAmount(gnc_amount.neg()) split2.SetReconcile('c')
gtx = Transaction(book) gtx.BeginEdit() gtx.SetCurrency(currency) gtx.SetDateEnteredTS(today) gtx.SetDatePostedTS(tx['date']) # or another datetime object for the transaction's "register date" gtx.SetDescription(str(tx['label'])) amount = tx['amount'] * 100 sp1 = Split(book) # First half of transaction sp1.SetParent(gtx) # The lookup string needs to match your account path exactly. sp1.SetAccount(dest_acc) # 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(str(tx['label'] + ' - Destiny')) sp2 = Split(book) # Need a balancing split sp2.SetParent(gtx) sp2.SetAccount(src_acc) sp2.SetValue(sp1.GetValue().neg()) sp2.SetAmount(sp1.GetValue().neg()) sp2.SetMemo(str(tx['label'] + ' - Source')) gtx.CommitEdit() # Finish editing transaction session.save()
def create_gnc_trade_txs(self, tx1:dict, tx2:dict): """ Create and load Gnucash transactions to the Gnucash file :param tx1: first transaction :param tx2: matching transaction if a switch :return: nil """ self.logger.print_info('create_gnc_trade_txs()', BLUE) # create a gnucash Tx gtx = Transaction(self.book) # gets a guid on construction gtx.BeginEdit() gtx.SetCurrency(self.currency) gtx.SetDate(tx1[TRADE_DAY], tx1[TRADE_MTH], tx1[TRADE_YR]) # self.dbg.print_info("gtx date = {}".format(gtx.GetDate()), BLUE) self.logger.print_info("tx1[DESC] = {}".format(tx1[DESC]), YELLOW) gtx.SetDescription(tx1[DESC]) # create the ASSET split for the Tx spl_ast = Split(self.book) spl_ast.SetParent(gtx) # set the account, value, and units of the Asset split spl_ast.SetAccount(tx1[ACCT]) spl_ast.SetValue(GncNumeric(tx1[GROSS], 100)) spl_ast.SetAmount(GncNumeric(tx1[UNITS], 10000)) if tx1[SWITCH]: # create the second ASSET split for the Tx spl_ast2 = Split(self.book) spl_ast2.SetParent(gtx) # set the Account, Value, and Units of the second ASSET split spl_ast2.SetAccount(tx2[ACCT]) spl_ast2.SetValue(GncNumeric(tx2[GROSS], 100)) spl_ast2.SetAmount(GncNumeric(tx2[UNITS], 10000)) # set Actions for the splits spl_ast2.SetAction("Buy" if tx1[UNITS] < 0 else "Sell") spl_ast.SetAction("Buy" if tx1[UNITS] > 0 else "Sell") # combine Notes for the Tx and set Memos for the splits gtx.SetNotes(tx1[NOTES] + " | " + tx2[NOTES]) spl_ast.SetMemo(tx1[NOTES]) spl_ast2.SetMemo(tx2[NOTES]) else: # the second split is for a REVENUE account spl_rev = Split(self.book) spl_rev.SetParent(gtx) # set the Account, Value and Reconciled of the REVENUE split spl_rev.SetAccount(tx1[REVENUE]) rev_gross = tx1[GROSS] * -1 # self.dbg.print_info("revenue gross = {}".format(rev_gross)) spl_rev.SetValue(GncNumeric(rev_gross, 100)) spl_rev.SetReconcile(CREC) # set Notes for the Tx gtx.SetNotes(tx1[NOTES]) # set Action for the ASSET split action = FEE if FEE in tx1[DESC] else ("Sell" if tx1[UNITS] < 0 else DIST) self.logger.print_info("action = {}".format(action)) spl_ast.SetAction(action) # ROLL BACK if something went wrong and the two splits DO NOT balance if not gtx.GetImbalanceValue().zero_p(): self.logger.print_error("Gnc tx IMBALANCE = {}!! Roll back transaction changes!" .format(gtx.GetImbalanceValue().to_string())) gtx.RollbackEdit() return if self.mode == PROD: self.logger.print_info("Mode = {}: Commit transaction changes.\n".format(self.mode), GREEN) gtx.CommitEdit() else: self.logger.print_info("Mode = {}: Roll back transaction changes!\n".format(self.mode), RED) gtx.RollbackEdit()