1#!/usr/bin/env python3
2
3# test_imbalance_transaction.py -- Test the transaction imbalace viewing
4# mechanisms
5#
6# Copyright (C) 2010 ParIT Worker Co-operative <transparency@parit.ca>
7# This program is free software; you can redistribute it and/or
8# modify it under the terms of the GNU General Public License as
9# published by the Free Software Foundation; either version 2 of
10# the License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program; if not, contact:
19# Free Software Foundation           Voice:  +1-617-542-5942
20# 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652
21# Boston, MA  02110-1301,  USA       gnu@gnu.org
22#
23# @author Mark Jenkins, ParIT Worker Co-operative <mark@parit.ca>
24
25##  @file
26#   @brief Test the transaction imbalace viewing mechanisms
27#   @author Mark Jenkins, ParIT Worker Co-operative <mark@parit.ca>
28#   @ingroup python_bindings_examples
29
30from sys import argv, exit
31
32from gnucash import Session, Transaction, Split, Account, GncNumeric, \
33    GncCommodity
34
35# argv[1] should be the path to an existing gnucash file/database
36# for a file, simply pass the pathname, for a database you can use
37# these forms:
38# mysql://user:password@host/dbname
39# postgres://user:password@host[:port]/dbname (the port is optional)
40#
41# You should try it out with a gnucash file with tranding accounts enabled
42# and trading accounts disabled
43
44if len(argv) < 2:
45    print('not enough parameters')
46    print('usage: test_imbalance_transaction.py {book_url}')
47    print('examples:')
48    print("python3 test_imbalance_transaction.py '/home/username/test.gnucash'")
49    exit()
50
51
52try:
53    session = Session(argv[1])
54
55    book = session.book
56
57    root = book.get_root_account()
58    root.get_instance()
59    commod_tab = session.book.get_table()
60    CAD = commod_tab.lookup("ISO4217","CAD")
61    USD = commod_tab.lookup("ISO4217","USD")
62    account = Account(book)
63    account2 = Account(book)
64    root.append_child(account)
65    root.append_child(account2)
66    account.SetCommodity(CAD)
67    account.SetName("blahblah")
68    account.SetType(3)
69    account2.SetCommodity(USD)
70    account2.SetName("blahblahsdfs ")
71    account2.SetType(3)
72
73    a = Transaction(book)
74    a.BeginEdit()
75
76    s = Split(book)
77    s.SetParent(a)
78    s2 = Split(book)
79    s2.SetParent(a)
80
81    a.SetCurrency(CAD)
82    s.SetAccount(account)
83    s.SetValue(GncNumeric(2))
84    s.SetAmount(GncNumeric(2))
85
86    s2.SetAccount(account2)
87    s2.SetValue(GncNumeric(4))
88    s2.SetAmount(GncNumeric(4))
89    print('overall imbalance', a.GetImbalanceValue().to_string())
90
91    print('per-currency imbalances')
92    imbalance_list = a.GetImbalance()
93    for (commod, value) in imbalance_list:
94        print(value.to_string(), commod.get_mnemonic())
95
96    a.CommitEdit()
97
98
99    session.end()
100    session.destroy()
101except:
102    if "session" in locals():
103        session.end()
104    raise
105